iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0
SideProject30

30 天學習 Docker 部署你的專案系列 第 21

DAY 21 - 在 instance 上跑 Docker Image

  • 分享至 

  • xImage
  •  

在 EC2 instance 登入 Docker Hub

docker login

除了可以使用之前在 DAY 18 - 將我的 Image 推到 Docker Hub 儲存庫 ,教的 docker login ,再根據指示輸入 username 跟 password 外,也可以用下面一句話搞定。

docker login -u < 我的 docker username > -p < 我的 docker password >

順利登入成功後,一樣可以看到 Login Succeeded

拉取我先前推上去的 image

docker pull krystallll/docker_test:1.0

https://ithelp.ithome.com.tw/upload/images/20231006/20151035I1Y39I4wi4.png

就跟我們 git pull 大同小異,只要打對 遠端儲存庫/image 名稱:tag 就可以順利 pull 下 image 啦!

確認是否 pull 成功

docker images

https://ithelp.ithome.com.tw/upload/images/20231006/20151035D7QjTeTNN4.png

可以看到我 EC2 instance 的本地成功有 krystallll/docker_test

迫不及待試跑看看 image

docker run -p 3000:3000 krystallll/docker_test:1.0

https://ithelp.ithome.com.tw/upload/images/20231006/20151035odtYxdRhHW.png

看起來跑成功了,但我瀏覽器要搜尋哪個網址呢?一樣是 http://0.0.0.0:3000 嗎?如果你試試相信會看到 404 無法連上這個網頁的字樣,因為 http://0.0.0.0:3000 是本機預設的,但我們現在在的地方是 EC2 inatance ,所以我們應該要去看看這個 instance 的是否有公開的 IP address 或是 DNS

https://ithelp.ithome.com.tw/upload/images/20231006/201510352he68pnGCJ.png

📍之所以找 Public (公開的) IP address 或是 DNS ,而不是 Private 是因為我們希望是一個別人搜尋也可以搜尋的到的網址,所以要用 Public。

使用正確的網址搜尋

http://ec2-52-199-213-167.ap-northeast-1.compute.amazonaws.com:3000

📍這邊在後面加上 :3000 是因為我們一開始指定 port 3000

http://52.199.213.167:3000

如果有跟這我做的話,那您的這兩個應該會跟我長不一樣,如果是是複製貼上上面那段,那你只會看到我的專案喔😜 甚至我的專案內容空空如也,可能比你的還不好看🤣

https://ithelp.ithome.com.tw/upload/images/20231006/20151035Nk73G0uuFv.png

你不是說這是正確的網址,為什麼還是連不上😡😡😡其實連不上的原因可能有很多,通常是網路的問題,那因為這邊我們比較特別是指定 3000 port ,所以首先我們可以先去查這個 instance 的網路是否有允許 3000 port。

確認網路安全群組

確認 instance 的 Security 叫什麼名字

  1. 勾選想確認的 instance

  2. 選擇 Security Tab

  3. 記住 Security groups 是哪個
    https://ithelp.ithome.com.tw/upload/images/20231006/201510355MvCa2ifw1.png

  4. 從左邊側邊欄找到 Security groups 按鈕,點進頁面

  5. 找到剛剛記住的 Security groups ,並勾選

  6. 點選 Actions 下拉選單

  7. 選擇 Edit inbound rules 來編緝這個網路安全群組
    https://ithelp.ithome.com.tw/upload/images/20231006/20151035HkOjloc86N.png

設置允許 3000 port 通過

  1. 點選 Add rule 新增安全群組的規則
  2. 選擇 Custom TCP 並在 Port range 填上 3000
  3. 點選 Save rules 將新增的規則儲存
    https://ithelp.ithome.com.tw/upload/images/20231006/20151035mYZm0EVu2r.png

退出容器再重新試一次

使用之前教過的 control 鍵 + c 鍵 停止容器,再 docker run -p 3000:3000 krystallll/docker_test:1.0 ,成功後在瀏覽器搜尋 http://ec2-52-199-213-167.ap-northeast-1.compute.amazonaws.com:3000

https://ithelp.ithome.com.tw/upload/images/20231006/20151035NzQBr1eRXe.png

登登新的錯誤訊息來了!但是只要看到這熟悉的畫面~~(最對味)~~ ,就知道至少是 rails 的錯誤了🥺🥺🥺
看起來是在說需要在 rails 加上設定 config.hosts,還貼的附上 官方文件 😍

設定 config.hosts ,重推 image

根據官方文件我們知道需要設定 config/environments/development.rb 或是 config/environments/production.rb ,那因為我們目前都是在 development ,所以我就設定 config/environments/development.rb

但是如果按照上面錯誤訊息那樣寫的話,本機請求的網址就會是 ec2-52-199-213-167.ap-northeast-1.compute.amazonaws.com 不是 localhost:3000 ,我希望在本機時跑 localhost:3000,在 EC2 instance 時,跑 ec2-52-199-213-167.ap-northeast-1.compute.amazonaws.com ,這邊有個新學到的方法跟大家分享:

config.hosts << "ec2-52-199-213-167.ap-northeast-1.compute.amazonaws.com:3000" unless Rails.root.join("tmp/hostname.txt").exist?

他會根據 tmp 裡面有沒有 hostname.txt 這個名稱的檔案,來決定是否要呈現 config.hosts << "ec2-52-199-213-167.ap-northeast-1.compute.amazonaws.com:3000" ,如果我們本機不需要 ec2 的 host ,那在 tmp 裡面新增一個名為 hostname.txt 即可。

也別忘了新增一個 .dockerignore 檔案,並加上:

/tmp/hostname.txt

https://ithelp.ithome.com.tw/upload/images/20231006/201510357dSOIT11UX.png

這樣這個檔案就不會進到 docker 裡。

📍.dockerignore 其實就跟.gitignore 是相同的概念。

完成後即可重新 build 一顆新的 image 推上 Dokcker Hub(別忘了先 docker login)

docker build -t krystallll/docker_test:1.0 . --push

在 EC2 instance 裡重新 pull 新的 image

因為剛剛上一步我們有重 push image ,所以我們需要拉最新的 image 下來運行

docker pull krystallll/docker_test:1.0

https://ithelp.ithome.com.tw/upload/images/20231006/20151035xEfu96Vh9m.png

重新啟動,打開瀏覽器

重複剛剛啟動容器docker run -p 3000:3000 krystallll/docker_test:1.0 ,成功後在瀏覽器搜尋 http://ec2-52-199-213-167.ap-northeast-1.compute.amazonaws.com:3000 ,可以看到
https://ithelp.ithome.com.tw/upload/images/20231006/20151035Z7mEhvN8hy.png

沒錯這是我們熟悉的錯誤從沒這麼期待看到錯誤,那既然做到根本機一樣,接下來我們就知道,需要在 EC2 instance 裡面加上 docker compose ,這就是我們明天的內容,明天見!


上一篇
DAY 20 - 連接到 EC2 instance 並下載 Docker
下一篇
DAY 22 - 在 EC2 instance 加上 docker compose 跑起來
系列文
30 天學習 Docker 部署你的專案30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言